﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.IO;
using System.Windows.Forms;
using ReplaceCsv.ListBoxItem;

namespace ReplaceCsv
{
    public partial class Form1 : Form
    {
        /// <summary>
        /// 置換ツールのインスタンス
        /// </summary>
        private InputOutputConverter converter;

        /// <summary>
        /// 出力ファイル名自動付与時のsuffixの文字
        /// </summary>
        protected string filename_suffix = "_o";

        public Form1()
        {
            InitializeComponent();
            //一旦はディスクトップに出力する仕様とする。後で修正予定20130223
            AutoSetOutputCsvFileName("");


            //ドラッグアンドドロップを生成 //20120723
            InitializeDragDrop();

            //converterを作成する。ここらへんは量産化のための改良が必要かな。。
            converter = InputOutputConvertInitiator.getInitialInstance("ConvertCsv");
        }
        /// <summary>
        /// ドラッグアンドドロップの初期化用メソッド
        /// </summary>
        protected void InitializeDragDrop()
        {
            //過去の参考　後で削除する。
            //this.InputCsvFileName.AllowDrop = true;
            //this.InputCsvFileName.DragEnter += new DragEventHandler(this.InputCsvFileName_DragEnter);
            //this.InputCsvFileName.DragDrop += new DragEventHandler(this.InputCsvFileName_DragDrop);

            this.inputLogFileList.AllowDrop = true;
            this.inputLogFileList.DragEnter += new DragEventHandler(this.InputWallCsvFileName_DragEnter);
            this.inputLogFileList.DragDrop += new DragEventHandler(this.InputWallCsvFileName_DragDrop);
        }
        /// <summary>
        /// 入力Wallデータパスのドラックエンター時のイベントハンドラ
        /// </summary>
        /// <param name="s"></param>
        /// <param name="e"></param>
        protected void InputWallCsvFileName_DragEnter(object s, DragEventArgs e)
        {
            e.Effect = DragDropEffects.All;
        }
        protected void InputWallCsvFileName_DragDrop(object s, DragEventArgs e)
        {
            ///////ここからここらか
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                foreach(string fileName in (string[])e.Data.GetData(DataFormats.FileDrop)){
                    InputWallCsvFileName_Add(fileName);
                }
                //string fileName = ((string[])e.Data.GetData(DataFormats.FileDrop))[0];
                //this.InputCsvFileName.Text = fileName;
                //出力パス側にも自動設定を行う
                //this.AutoSetOutputCsvFileName(fileName);
            }
        }
        /// <summary>
        /// ファイル名をチェックリストボックスに追加する。
        /// </summary>
        /// <param name="fileName"></param>
        private void InputWallCsvFileName_Add(string fileName)
        {
            this.inputLogFileList.Items.Add(new FileNameCupsule(fileName));
            //this.inputLogFileList.Items.Add(fileName);
            CheckedListBox.ObjectCollection list = this.inputLogFileList.Items;
            this.inputLogFileList.SetItemChecked((list.Count - 1), true);
        }
        /// <summary>
        /// 入力パスのドラッグエンター時のイベントハンドラ
        /// </summary>
        /// <param name="s"></param>
        /// <param name="e"></param>
        protected void InputCsvFileName_DragEnter(object s, DragEventArgs e)
        {
            e.Effect = DragDropEffects.All;
        }
        /// <summary>
        /// 入力パスのドラッグアンドドロップ時のイベントハンドラ
        /// </summary>
        /// <param name="s"></param>
        /// <param name="e"></param>
        protected void InputCsvFileName_DragDrop(object s, DragEventArgs e)
        {
            //基本的に、ドラッグされた初めの一つのファイルだけ置換対象とする
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                string fileName = ((string[])e.Data.GetData(DataFormats.FileDrop))[0];
                this.InputCsvFileName.Text = fileName;
                //出力パス側にも自動設定を行う
                this.AutoSetOutputCsvFileName(fileName);

            }
        }
        /// <summary>
        /// 出力パス側の自動設定用メソッド）
        /// </summary>
        /// <param name="fileName"></param>
        protected void AutoSetOutputCsvFileName(string fileName)
        {
            //string dir = Path.GetDirectoryName(fileName);
            //string fName = Path.GetFileNameWithoutExtension(fileName);
            //string ext = Path.GetExtension(fileName);

            //拡張子の前にサフィックスを付与する
            //this.OutputCsvFileName.Text = dir + "\\" + fName + this.filename_suffix + "." + ext;
            //this.OutputCsvFileName.Text = dir + "\\" + fName + this.filename_suffix + ext;

            //一旦ディスクトップに出力する仕様にしておく
            string dir = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            //出力ファイルはwall滞在時間ログ.csv固定。
            this.OutputCsvFileName.Text = dir + "\\" + "wall滞在時間ログ.csv";
            //出力ファイル2はwall平均滞在時間ログ.csv固定。
            this.OutputCsv2FileName.Text = dir + "\\" + "wall平均滞在時間ログ.csv";
            //出力ファイル3はwall滞在時間分布ログ.csv固定。
            this.OutputCsv3FileName.Text = dir + "\\" + "wallランキング処理用ログ.csv";

            //出力ファイル4はジエスタログ.csv固定。
            this.OutputCsv4FileName.Text = dir + "\\" + "ジエスタログ.csv";
        }
        /// <summary>
        /// ファイル名が同じかどうかを確認する
        /// </summary>
        /// <param name="o"></param>
        /// <param name="i"></param>
        /// <returns></returns>
        protected bool isEqualFileName(string o, string i)
        {
            return o.Equals(i, StringComparison.InvariantCultureIgnoreCase);
        }
        /// <summary>
        /// 出力ファイルと入力ファイルを比較する
        /// </summary>
        /// <param name="fileName">出力ファイル</param>
        /// <param name="inputName">入力ファイル</param>
        /// <returns></returns>
        protected string treatOutputFile(string fileName,string inputName)
        {
            //ファイル名が大文字小文字無視で同じかどうか
            if (isEqualFileName(fileName,inputName))
            {
                string dir = Path.GetDirectoryName(fileName);
                //string fName = Path.GetFileNameWithoutExtension(fileName);
                //string ext = Path.GetExtension(fileName);
                string fName = "..." + Path.GetFileName(fileName);
                return dir + "\\" + fName;
            }
            else
            {
                return fileName;
            }

        }

        /// <summary>
        /// 入力ファイル選択ボタンのクリック時のイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void InputCsvFileSelectButton_Click(object sender, EventArgs e)
        {
            //
            //拡張子をcsvに指定する
            this.openFileDialogCsv.DefaultExt = this.converter.getInputExt();
            this.openFileDialogCsv.Multiselect = true;
            this.openFileDialogCsv.Filter = "CSV (*.csv)|*.csv|すべて(*.*)|*.*";
            string dbg = this.converter.getInputExt();
            DialogResult result = this.openFileDialogCsv.ShowDialog(this);
            if (result == System.Windows.Forms.DialogResult.OK)
            {
                string[] FileNames = this.openFileDialogCsv.FileNames;

                foreach (string fileName in FileNames)
                {
                    //InputCsvFileSelectButton_Click_FileSet(this.openFileDialogCsv.FileName); 
                    InputWallCsvFileName_Add(fileName);
                }
            }
        }
        private void InputCsvFileSelectButton_Click_FileSet(string fileName) 
        {
            this.InputCsvFileName.Text = this.openFileDialogCsv.FileName;
        }

        /// <summary>
        /// 出力ファイル選択ボタンのクリック時のイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OutputCsvFileSelectButton_Click(object sender, EventArgs e)
        {
            this.saveFileDialogCsv.DefaultExt = this.converter.getOutputExt();
            this.saveFileDialogCsv.Filter = "CSV (*.csv)|*.csv|すべて(*.*)|*.*";
            DialogResult result = this.saveFileDialogCsv.ShowDialog(this);
            if (result == System.Windows.Forms.DialogResult.OK)
            {
                this.OutputCsvFileName.Text = this.saveFileDialogCsv.FileName;
            }
        }
        /// <summary>
        /// クリアボタンの実装
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void InputFileListInitButton_Click(object sender, EventArgs e)
        {
            this.inputLogFileList.Items.Clear();
        }

        /// <summary>
        /// 置換ボタンクリック時のイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ConvertButton_Click(object sender, EventArgs e)
        {
            //MessageBox.Show("まだ作成中です", "お待ちを", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
            //return;
            //実行メソッドは別にしておく
            ConvertButton_Click_Exec(sender, e);
        }
        private List<FileNameCupsule> getCheckedFileNames()
        {
            List<FileNameCupsule> result = new List<FileNameCupsule>();
            foreach (FileNameCupsule fc in this.inputLogFileList.CheckedItems)
            {
                result.Add(fc);
            }
            return result;
        }
        private string[] getFileNames(List<FileNameCupsule> input)
        {
            string[] result = new string[input.Count];
            int cnt = 0;
            foreach ( FileNameCupsule fc in input){
                result[cnt] = fc.FilePath;
                cnt++;
            }
            return result;
        }

        /// <summary>
        /// ConvertButton_Clickの実装メソッド
        /// まだ何もしていない
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ConvertButton_Click_Exec(object sender, EventArgs e)
        {

            ///MessageBox.Show("開始パス:" + Application.StartupPath, "アラート", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1);


            //ファイル名を取得
            List<FileNameCupsule> inputFiles = getCheckedFileNames();
            foreach(FileNameCupsule f in inputFiles){
                if (!File.Exists(f.FilePath))
                {
                    MessageBox.Show("入力ファイル名:"+f.ToString()+" が正しくありません。ファイル名をチェックしてください", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                    return;
                }
            }
            string[] inputFileNames = getFileNames(inputFiles);

            //string inputName = this.InputCsvFileName.Text;
            //if (!File.Exists(inputName))
            //{
                //エラーメッセージ表示方法は後で対応
                //MessageBox.Show("入力ファイル名が正しくありません。ファイル名をチェックしてください", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                //return;
            //}
            string outputName = this.OutputCsvFileName.Text;
            string outputName2 = this.OutputCsv2FileName.Text;
            string outputName3 = this.OutputCsv3FileName.Text;
            string outputName4 = this.OutputCsv4FileName.Text;
            //もろもろのチェック処理は後で実施
            //20130618 #ジエスタ#　テスト版
            //string[] outputs = new string[3];
            string[] outputs = new string[4];
            outputs[0] = outputName;
            outputs[1] = outputName2;
            outputs[2] = outputName3;
            //outputs[3] = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\" + "ジエスタログ.csv";
            outputs[3] = outputName4;

            if (this.converter.createInstance(inputFileNames, outputs, new Dictionary<string, object>()).execute(this.convertProgressBar))
            {
                MessageBox.Show("処理完了しました。出力ファイルを確認ください", "完了", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1);
            }
            else
            {
                //エラーメッセージ表示方法は後で対応
                MessageBox.Show("実行エラーが発生しました。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);

            }
            //bool equalFile = this.isEqualFileName(outputName, inputName);
            //try
            //{
                //if (File.Exists(outputName))
                //{
                    //DialogResult res;
                    //if (equalFile)
                    //{
                        //res = MessageBox.Show("入力ファイルを直接上書きしてもよろしいですか？", "重要な確認", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    //}
                    //else
                    //{
                        //res = MessageBox.Show("ファイルを上書きしてもよろしいですか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    //}
                    //上書きYes以外であれば、メソッド終了
                    //if (res != DialogResult.Yes) return;
                //}
                //if (equalFile)
                //{
                    //outputName = this.treatOutputFile(outputName, inputName);
                //}
                //0バイト文字で初期化できるかどうかを確認する。
                //File.WriteAllText(outputName, "");
            //}
            //catch (Exception ex)
            //{
                //エラーメッセージ表示方法は後で対応
                //MessageBox.Show("出力ファイル名が正しくありません。ファイル名をチェックしてください", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                //return;
            //}
            ////変換を実施
            //if (this.converter.createInstance(inputName, outputName).execute(this.convertProgressBar))
            //{
                //同一ファイルの場合
                //if (equalFile)
                //{
                    //try
                    //{
                        //File.Copy(outputName, inputName, true);
                    //}
                    //catch (Exception ex)
                    //{
                        //エラーメッセージ表示方法は後で対応
                        //MessageBox.Show("入力ファイルに上書きすることができません。他のプログラムで開いていないかチェックをしてください", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                        //this.convertProgressBar.Value = this.convertProgressBar.Minimum;
                        //return;
                    //}
                    //finally
                    //{
                        //deleteFile(outputName);
                    //}
                //}
                //エラーメッセージ表示方法は後で対応
                //MessageBox.Show("置換が完了しました。出力ファイルを確認ください", "完了", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1);
                //this.convertProgressBar.Value = this.convertProgressBar.Minimum;
                //Application.DoEvents();
            //}
            //else
            //{
                //エラーメッセージ表示方法は後で対応
                //MessageBox.Show("実行エラーが発生しました。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
            //}
        }
        /// <summary>
        /// 異常終了しないで、削除する
        /// </summary>
        /// <param name="fileName"></param>
        protected void deleteFile(string fileName)
        {
            try
            {
                File.Delete(fileName);
            }
            catch (Exception ex)
            {
            }
        }
        //特にいま、何もしない。。作られちゃった。。
        private void saveFileDialogCsv_FileOk(object sender, CancelEventArgs e)
        {

        }
        //特にいま、何もしない。。作られちゃった。。
        private void convertProgressBar_Click(object sender, EventArgs e)
        {

        }
        //特にいま、何もしない。。作られちゃった。。
        private void label1_Click(object sender, EventArgs e)
        {

        }
        //特にいま、何もしない。。作られちゃった。。
        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void OutputCsv2FileSelectButton_Click(object sender, EventArgs e)
        {
            this.saveFileDialogCsv.DefaultExt = this.converter.getOutputExt();
            this.saveFileDialogCsv.Filter = "CSV (*.csv)|*.csv|すべて(*.*)|*.*";
            DialogResult result = this.saveFileDialogCsv.ShowDialog(this);
            if (result == System.Windows.Forms.DialogResult.OK)
            {
                this.OutputCsv2FileName.Text = this.saveFileDialogCsv.FileName;
            }

        }

        private void OutputCsv3FileSelectButton_Click(object sender, EventArgs e)
        {
            this.saveFileDialogCsv.DefaultExt = this.converter.getOutputExt();
            this.saveFileDialogCsv.Filter = "CSV (*.csv)|*.csv|すべて(*.*)|*.*";
            DialogResult result = this.saveFileDialogCsv.ShowDialog(this);
            if (result == System.Windows.Forms.DialogResult.OK)
            {
                this.OutputCsv3FileName.Text = this.saveFileDialogCsv.FileName;
            }
        }

        private void OutputCsv4FileName_TextChanged(object sender, EventArgs e)
        {

        }

        private void OutputCsv4FileSelectButton_Click(object sender, EventArgs e)
        {
            this.saveFileDialogCsv.DefaultExt = this.converter.getOutputExt();
            this.saveFileDialogCsv.Filter = "CSV (*.csv)|*.csv|すべて(*.*)|*.*";
            DialogResult result = this.saveFileDialogCsv.ShowDialog(this);
            if (result == System.Windows.Forms.DialogResult.OK)
            {
                this.OutputCsv4FileName.Text = this.saveFileDialogCsv.FileName;
            }
        }

        private void label5_Click(object sender, EventArgs e)
        {

        }


    }
}
